package com.youhome.service.service;

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.*;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.sts.model.v20150401.AssumeRoleResponse;
import com.youhome.common.config.OSSConfig;
import com.youhome.common.config.ReportOSSConfig;
import com.youhome.common.exception.CustomException;
import com.youhome.utils.FileUtils;
import sun.misc.BASE64Decoder;

import java.io.*;
import java.net.URL;
import java.util.Date;
import java.util.List;

/**
 * Created by chen365 on 2019/01/16.
 */
public interface OSSService {
    AssumeRoleResponse.Credentials getOssToken() throws ClientException;

    boolean delete(String key);

    boolean delete(List<String> key);

    String upload(File file);

    String upload(String folder, File file);

    //************************************************


    /**
     * 创建存储空间
     *
     * @param ossClient  OSS连接
     * @param bucketName 存储空间
     * @return
     */
     String createBucketName(OSSClient ossClient, String bucketName);

    /**
     * 删除存储空间buckName
     *
     * @param ossClient  oss对象
     * @param bucketName 存储空间
     */
    void deleteBucket(OSSClient ossClient, String bucketName);

    /**
     * 创建模拟文件夹
     *
     * @param ossClient  oss连接
     * @param bucketName 存储空间
     * @param folder     模拟文件夹名如"qj_nanjing/"
     * @return 文件夹名
     */
    String createFolder(OSSClient ossClient, String bucketName, String folder);

    void delete(String endpoint, String accessKeyId, String accessKeySecret, String bucketName, String key) ;

    void delete(String endpoint, String accessKeyId, String accessKeySecret, String bucketName, List<String> keys);


    /**
     * 上传图片至OSS
     *
     * @param ossClient  oss连接
     * @param file       上传文件（文件全路径如：D:\\image\\photos1.jpg）
     * @param bucketName 存储空间
     * @param folder     模拟文件夹名 如"photos/"
     * @return String 返回的唯一MD5数字签名
     */
   String uploadObject2OSS(OSSClient ossClient, File file, String bucketName, String folder) ;


    /**
     * 上传文件至OSS
     *
     * @param ossClient  oss连接
     * @param file       上传文件（文件全路径如：D:\\image\\photos1.jpg）
     * @param bucketName 存储空间
     * @return String 返回的唯一MD5数字签名
     */
   String uploadObject2OSS(OSSClient ossClient, File file, String bucketName) ;


    /**
     * @param ossClient
     * @param data
     * @param filename
     * @param bucketName
     * @return
     */
   String uploadObject2OSS(OSSClient ossClient, String data, String filename, String bucketName) ;

    /**
     * 上传图片至OSS
     *
     * @param ossClient  oss连接
     * @param bytes      上传文件（文件全路径如：D:\\image\\photos1.jpg）
     * @param bucketName 存储空间
     * @param folder     模拟文件夹名 如"photos/"
     * @return String 返回的唯一MD5数字签名
     */
   String uploadObject2OSS(OSSClient ossClient, byte[] bytes, String fileName, String bucketName, String folder);
   String uploadObject2OSS(byte[] bytes, String fileName, String bucketName, String folder);


   Boolean exist(String endpoint, String accessKeyId, String accessKeySecret, String bucketName, String key);

   Boolean exist(OSSClient ossClient, String bucketName, String key);

    /**
     * 创建临时访问路径
     *
     * @param ossConfig
     * @param key       文件名
     * @param time      有效时长 ms
     * @return
     */
   String createTemporaryUrl(OSSConfig ossConfig, String key, Long time) ;

   /**
     * 创建临时访问路径
     *
     * @param ossConfig
     * @param key       文件名
     * @param time      有效时长 ms
     * @return
     */

   String createTemporaryUrl(ReportOSSConfig ossConfig, String key, Long time);

    /**
     * 创建临时访问路径
     *
     * @param client
     * @param backetName
     * @param key
     * @param time
     * @return
     */
   String createTemporaryUrl(OSSClient client, String backetName, String key, Long time) ;

    /**
     * 下载json
     *
     * @return
     */
   String downloadJson(OSSClient ossClient, String bucketName, String key) ;

   void delete(OSSClient ossClient, String bucketName, String key);

    AssumeRoleResponse.Credentials getVideoToken() throws CustomException;
}
